const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

const pages = [
    { template: './src/views/index.html', filename: 'index.html', chunks: ['index', 'main'], title: '主页' },
    { template: './src/views/result.html', filename: 'result.html', chunks: ['result', 'main'], title: '结果页' }
]

const HtmlWebpackPlugins = pages.map(({ template, filename, chunks }) => {
    return new HtmlWebpackPlugin({
        template,
        filename,
        chunks,
        inject: 'body'
    })
})

module.exports = {
    entry: {
        main: './src/app.ts', // 入口函数
        index: './src/js/index.ts',
        chunk: './src/js/chunk.js',
        result: './src/js/result.js'
    },
    output: {
        filename: 'js/[name].[chunkhash:8].js',
        /* publicPath: './', */
        path: resolve(__dirname, './dist')
    },
    resolve: {
        alias: {
            '@': resolve(__dirname, 'src/')
        },
        extensions: ['.ts', '.tsx', '.js', '.json']
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'postcss-loader'
                ]
            },
            {
                test: /\.less$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    'less-loader',
                    'postcss-loader'
                ]
            },
            {
                test: /\.(png|jpg|jepg|gif)$/,
                loader: 'url-loader',
                options: {
                    // 配置
                    // 当图片大小小于8kb，就会被转化成base64
                    //  优点 ： 减少请求数量，减轻服务器压力，
                    // 缺点 ：图片体积关于增大
                    limit: 10 * 1024,
                    // 关闭url-load的es6模块化，使用commen.js
                    esModule: false,
                    // name  对图片重命名 
                    // [hash:10] 取图片的hash前10位
                    // [ext] 取文件原来的拓展名
                    name: '[hash:10].[ext]',
                    // 图片资源输出 输出到build/img
                    outputPath: 'img'
                }
            },
            {
                test: /\.(js|jsx)$/,
                exclude: /(node_modules|bower_components)/,
                loader: 'babel-loader'
            },
            {
                test: /\.(ts|tsx)$/,
                use: 'ts-loader',
                exclude: /node_modules/
            }
        ]
    },
    performance: {
        hints: 'warning',
        //入口起点的最大体积 整数类型（以字节为单位）
        maxEntrypointSize: 50000000,
        //生成文件的最大体积 整数类型（以字节为单位 300k）
        maxAssetSize: 30000000,
        //只给出 js 文件的性能提示
        assetFilter: function (assetFilename) {
            return assetFilename.endsWith('.css') || assetFilename.endsWith('.js');
        }
    },
    devServer: {
        // npx webpack-dev-server 会在内存中编译打包，没有输出，实时监听
        // 运行目录
        static: {
            directory: resolve(__dirname, './dist'),
        },
        // 启动gzip压缩 使代码更小
        compress: true,
        // 端口号
        port: 9200,
        // 自动打开浏览器
        open: true,
        // 端口
        host: 'localhost',
        hot: true,
        proxy: {
            '/api': {
                target: 'https://www.gogbuy.com',
                changeOrigin: true,
                pathRewrite: {
                    '^/api': ''
                }
            }
        }
    },
    mode: 'development',
    plugins: [
        // 详细的插件配置
        // 1. html配置
        ...HtmlWebpackPlugins,
        // 2 css配置
        new MiniCssExtractPlugin({
            //输出文件夹和文件名
            filename: "css/[name].[chunkhash:8].css",
        }),
        // 每次build清除dist包
        new CleanWebpackPlugin()
    ],

}